﻿#include "messageutil.h"

#define WITH_REPLY_MASK 0x80
#define HEADER_LENGTH 0x0a
#define LINKTEST_TEST_SESSIONID 0xffff

QByteArray MessageUtil::Select_Req(quint16 sessionId,
                                   quint32 transactionId)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SELECT_REQ));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::Select_Rsp(quint16 sessionId,
                                   quint32 transactionId,
                                   SecsEnum::SelectStatus select_status)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(select_status));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SELECT_RSP));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::DeSelect_Req(quint16 sessionId,
                                     quint32 transactionId)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::DESELECT_REQ));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::DeSelect_Rsp(quint16 sessionId,
                                     quint32 transactionId,
                                     SecsEnum::DeselectStatus deselect_status)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(deselect_status));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::DESELECT_RSP));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::Link_Test_Req(quint32 transactionId)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(LINKTEST_TEST_SESSIONID));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::LINKTEST_REQ));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::Link_Test_Rsp(quint32 transactionId)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(LINKTEST_TEST_SESSIONID));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::LINKTEST_RSP));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::Reject_Req(quint16 sessionId,
                                   quint32 transactionId,
                                   SecsEnum::RejectReasonCode reason_code,
                                   quint8 reject_message)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(reject_message));
    array.append(ConversionUtil::U1ToByteArray(reason_code));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::REJECT));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::Separate_Req(quint16 sessionId,
                                     quint32 transactionId)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(0));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SEPARATE));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    return array;
}

QByteArray MessageUtil::SxFy(quint16 sessionId,
                             quint32 transactionId,
                             int stream,
                             int function,
                             bool withReply,
                             Text *messageText)
{
    QByteArray array;
    array.append(ConversionUtil::U4ToByteArray(HEADER_LENGTH + messageText->getByteArray().length()));
    array.append(ConversionUtil::U2ToByteArray(sessionId));
    array.append(ConversionUtil::U1ToByteArray(withReply ? (stream | WITH_REPLY_MASK) : stream));
    array.append(ConversionUtil::U1ToByteArray(function));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::SECS_II));
    array.append(ConversionUtil::U1ToByteArray(SecsEnum::DATA));
    array.append(ConversionUtil::U4ToByteArray(transactionId));
    array.append(messageText->getByteArray());
    return array;
}
